﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "IDwgLayerInformation.h"
#include "FileImporterDefs.h"

namespace gcmp
{
    class Box3d;
    class UniIdentity;

    /// \brief CAD图形元素，用于各类CAD格式的文件导入
    class GCMP_MODEL_INTERFACE_EXPORT IImportCADElement : public IElement
    {
        DEFINE_CAST_DERIVED(gcmp::IImportCADElement, gcmp::IElement);

    public:
        /// \brief 获取导入的CAD文件整体的包围盒
        /// 
        /// return 导入的CAD的包围盒
        virtual Box3d GetBoundingBox() const = 0;

        /// \brief 设置导入文件到指定的视图
        /// 
        /// 该方法用于在ImportFile()后通过SetModelViewId()指定视图，这样只在该视图上可见
        /// \param modelViewId 指定的视图Id
        virtual void SetModelViewId(const ElementId& modelViewId) = 0;
        /// \brief 获取导入文件的视图
        /// 
        /// 该方法返回指定的视图Id
        /// \return 指定的视图Id
        virtual ElementId GetModelViewId() const = 0;

        /// \brief 获取导入CAD对象名称
        /// 
        /// \return 导入CAD对象名称
        virtual std::wstring GetName() const = 0;
  
        /// \brief 获取导入CAD对象的单位
        /// 
        /// \return 导入CAD对象的单位
        virtual EnImportUnit GetImportUnit() const = 0;

        /// \brief 获取导入CAD对象的比例
        /// 
        /// \return 导入CAD对象的比例
        virtual double GetScale() const = 0;

        /// \brief 图层修改后需要重新设置
        /// 
        /// \param layerInfos 用户修改后的图层信息
        virtual void SetLayerInformations(const std::vector<OwnerPtr<IDwgLayerInformation>>& layerInfos) = 0;

        /// \brief 获取导入CAD对象的图层信息
        /// 
        /// \return 导入CAD对象的图层信息
        virtual std::vector<OwnerPtr<IDwgLayerInformation>> GetLayerInformations() const = 0;

        /// \brief 获取GNode节点所在Group的图层名称
        /// 
        /// \param groupNodeId 组节点id
        /// \return 导入CAD对象名称
        virtual std::wstring GetLayerName(const GraphicsNodeId& groupNodeId) const = 0;

        /// \brief 获取选择对象的图层信息
        /// 
        /// \param nodeReferences 拾取的节点信息
        /// \return 拾取节点的图层信息
        virtual std::vector<OwnerPtr<IDwgLayerInformation>> GetLayerInformations(const std::vector<IGraphicsNodeReference*>& nodeReferences) const = 0;

        /// \brief 设置导入CAD对象的透明比例
        /// 
        /// \param transparentScale-透明比例0~1.0 bIncreaseing-暂未使用
        /// \return 成功与否
        virtual bool SetTransparencyScale(double transparentScale, bool bIncreaseing) = 0;

        /// \brief 获取导入CAD对象的无效字体
        /// 
        /// \param bUseRecord-是否使用记录到的字体/文字信息
        /// \return 无效字体列表-比如 [(a.shx,0),(B.shx,1)] 分别代表单线体和大字体
        virtual std::vector<std::pair<std::wstring,int>> GetInvalidFonts(bool bUseRecord) = 0;

        /// \brief 替换导入CAD对象的无效字体
        /// 
        /// \param fontMap-字体替换表-记录字体名称(不带路径) 比如 A.shx-宋体
        /// \return 成功与否
        virtual bool ReplaceGTextFonts(const std::map<std::wstring, std::wstring>& fontMap) = 0;

        /// \brief 获取导入CAD对象的插入点/对齐点
        /// 
        /// \return 对齐点
        virtual Vector3d GetAlignPoint() const = 0;

    public:
        /// \brief 获取Implementation Uid
        ///
        /// \return UniIdentity 返回ImplementationUid
        static UniIdentity GetImplementationUid();

        /// \brief 获取style Uid
        ///
        /// \return UniIdentity
        static UniIdentity GetStyleUid();
    };
}